#include "pch.hpp"
#include "GlyphModel.hpp"




GlyphModel::GlyphModel(const Document::ptr& document)
	: m_document(document)
{}
///////////////////////////////////////////////////////////////////////////////////////////////////




void GlyphModel::setDocument(const Document::ptr& document)
{
	if(m_document == document)
		return;

	if(m_document && m_document->styleDocument().glyphs().size())
	{
		beginRemoveRows(QModelIndex(), 0, m_document->styleDocument().glyphs().size() - 1);
		m_document->styleDocument().glyphs().clear();
		endRemoveRows();
	}

	if(document && document->styleDocument().glyphs().size())
	{
		beginInsertRows(QModelIndex(), 0, document->styleDocument().glyphs().size() - 1);
		m_document = document;
		endInsertRows();
	}
	else
	{
		m_document = document;
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

AdvancedGlyph& GlyphModel::glyph(QModelIndex index)
{
	if(!m_document)
		BOOSTEXT_THROW(programming_error("Non-existent model"));

	Glyphs& glyphs = m_document->styleDocument().glyphs();

	if(index.row() >= glyphs.size())
		BOOSTEXT_THROW(out_of_range_exception(index.row(), 0, glyphs.size()));

	Glyphs::iterator i = glyphs.begin();
	std::advance(i, index.row());

	return *i;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

const AdvancedGlyph& GlyphModel::glyph(QModelIndex index) const
{
	if(!m_document)
		BOOSTEXT_THROW(programming_error("Non-existent model"));

	const Glyphs& glyphs = m_document->styleDocument().glyphs();

	if(index.row() >= glyphs.size())
		BOOSTEXT_THROW(out_of_range_exception(index.row(), 0, glyphs.size()));

	Glyphs::const_iterator i = glyphs.begin();
	std::advance(i, index.row());

	return *i;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




int GlyphModel::rowCount(const QModelIndex &parent /*= QModelIndex()*/) const
{
	return m_document ? m_document->styleDocument().glyphs().size() : 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QVariant GlyphModel::data(const QModelIndex& index, int role) const
{
	if(!m_document)
		BOOSTEXT_THROW(programming_error("Non-existent model"));

	switch(role)
	{
	case Qt::DisplayRole:
		{
			return glyph(index).name();
		}
		break;
	}

	return QVariant();
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void GlyphModel::add(const AdvancedGlyph& glyph)
{
	if(!m_document)
		BOOSTEXT_THROW(programming_error("Non-existent model"));

	int row = calculateRow(glyph);

	beginInsertRows(QModelIndex(), row, row);
	m_document->styleDocument().add(glyph);
	endInsertRows();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void GlyphModel::remove(const QModelIndex& index)
{
	if(!m_document)
		BOOSTEXT_THROW(programming_error("Non-existent model"));

	const AdvancedGlyph& g = glyph(index);

	beginRemoveRows(QModelIndex(), index.row(), index.row());
	m_document->styleDocument().remove(g.name());
	endRemoveRows();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

int GlyphModel::calculateRow(const AdvancedGlyph& glyph) const
{
	if(!m_document)
		BOOSTEXT_THROW(programming_error("Non-existent model"));

	Glyphs glyphs = m_document->styleDocument().glyphs();
	Glyphs::iterator i = glyphs.insert(glyph.name(), glyph);

	return std::distance(glyphs.begin(), i);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
